﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// Reviewed

#pragma once
#include "Matrix4d.h"

namespace gcmp
{
    /// \brief Matrix4d的工具类
    ///
    /// 
    class GCMP_MATH_INTERFACE_EXPORT Matrix4dUtils
    {
    public:

        /// \brief   判断两个传入矩阵是否在给定误差下相等
        ///
        /// \param matrix1   传入矩阵
        /// \param matrix2   传入矩阵
        /// \param tolerance  给定误差
        /// \return   true: 相等 ，false: 不相等
        static bool IsEqual(const Matrix4d& matrix1, const Matrix4d& matrix2, double tolerance = gcmp::Constants::DOUBLE_EPS);

        /// \brief   三维点point左乘矩阵   result = point x matrix
        ///
        /// \param point  传入的三维点
        /// \param matrix 传入矩阵
        /// \return   返回的三维点
        static Vector3d PointMultiplyMatrix(const Vector3d& point, const Matrix4d& matrix);

        /// \brief   行向量vec左乘矩阵,无视偏移信息  result = vec x matrix
        ///
        /// \param vec  传入的行向量
        /// \param matrix  传入矩阵
        /// \return  返回的三维点
        static Vector3d VectorMultiplyMatrix(const Vector3d& vec, const Matrix4d& matrix);

        /// \brief  两个矩阵之间插值
        ///
        /// \param matrix1 矩阵1  必须是右手正交的平移旋转矩阵
        /// \param matrix2 矩阵2  必须是右手正交的平移旋转矩阵
        /// \param coefficient 系数，当coefficient=0时，返回matrix1；当coefficient=1时，返回matrix2
        /// \return  true 成功； false 失败
        static bool Interpolate(const Matrix4d& matrix1, const Matrix4d& matrix2, double coefficient, Matrix4d& interpolatedMatrix);

        /// \brief  获取矩阵的旋转轴和旋转角度(多解，返回其中一种可能结果)
        ///
        /// \param matrix 矩阵  必须是右手正交的平移旋转矩阵
        /// \param rotationAxis 旋转轴
        /// \param angle 旋转角度
        /// \return  true 成功； false 失败
        static bool GetRotationAxisAndAngle(const Matrix4d& matrix, Vector3d& rotationAxis, double& angle);
    };
}

